package xyz.sekai52799.answer.a401_a600;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Question532 {

    // leetcode第532题
//    给你一个整数数组nums 和一个整数k，请你在数组中找出 不同的k-diff 数对，并返回不同的 k-diff 数对 的数目。
//
//    k-diff数对定义为一个整数对 (nums[i], nums[j]) ，并满足下述全部条件：
//
//            0 <= i, j < nums.length
//    i != j
//    nums[i] - nums[j] == k
//    注意，|val| 表示 val 的绝对值。
//
//
//
//    示例 1：
//
//    输入：nums = [3, 1, 4, 1, 5], k = 2
//    输出：2
//    解释：数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
//    尽管数组中有两个 1 ，但我们只应返回不同的数对的数量。
//    示例 2：
//
//    输入：nums = [1, 2, 3, 4, 5], k = 1
//    输出：4
//    解释：数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5) 。
//    示例 3：
//
//    输入：nums = [1, 3, 1, 5, 4], k = 0
//    输出：1
//    解释：数组中只有一个 0-diff 数对，(1, 1) 。
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode.cn/problems/k-diff-pairs-in-an-array
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
    public static int findPairs(int[] nums, int k) {
        int count = 0;

        // 分成两种情况，第一种就是k为0的时候，第二种就是k不为0的时候
        if (k == 0){
            // k为0时，用HashMap来装，key是数字本身，value是数字出现的次数
            HashMap<Integer,Integer> numMap = new HashMap();
            for (int i : nums){
                if (numMap.containsKey(i)) {
                    numMap.put(i,numMap.get(i) + 1);
                } else {
                    numMap.put(i, 1);
                }
            }
            Integer[] temp = new Integer[numMap.size()];
            numMap.values().toArray(temp);

            for (Integer value : temp){
                if (value > 1){
                    count++;
                }
            }
            return count;
        }

        Set numSet = new HashSet();
        for (Integer a : nums){
            numSet.add(a);
        }

        Integer[] temp = new Integer[numSet.size()];
        numSet.toArray(temp);

        for (Integer num : temp){
            if (numSet.contains(num + k)){
                count++;
            }
        }

        return count;

    }

}
